home *** CD-ROM | disk | FTP | other *** search
- G8BPQ Host Mode
-
- From Version 4.00, a new application interface to the switch is provided.
- This replaces the existing interfaces (TNC2, PK Host and KISS). New
- software should if possible use the new interface - interface routines
- supporting the old modes, and WA8DED Host mode, will be provided as TSRs
- to support existing application software.
-
- The interface is normally called using INT 7Fh. From version 4.03 the interrupt
- number may be changed - The value is specified in BPQCFG.TXT as INTERRUPT=nnn,
- where nnn is in decimal. The function required is in AH, and the stream in AL.
- The system supports 64 streams, or sessions, numbered from 1 - 64.
-
- Changes in Version 4.05.
-
- 1. Additional option on funtion 6 - allows connects using BBS Call, even
- if APPLMASK is not set (say to prevent connects).
-
- 2. Additional info returned by function 8.
-
- 3. Format of frame returned by function 11 added to documentation.
-
- 4. Function 15 added. Simplifies access to timing info.
-
- 5. Broadcast option added. If function 2 is called with AL=0, the
- data will be sent as a UI frame to all ports which have an UNPROTO
- address set.
-
- 6. Function 12 added to update Beacon text.
-
-
- Changes in Version 4.07b
-
- 1. Function 0 added to check if loaded, and get version number. This
- is because the old method of checking (looking at the bytes before
- the interrupt routine) isn't compatible with some versions of
- DesqView, or the Windows version of the switch (coming soon!)
-
- 2. Function 12 extended to allow application to request a NODES
- broadcast.
-
- 3. Function 13 added to allow application to request a free stream and
- to free a stream after use. This will simplify configuration when
- several applications are used.
-
-
- Note that in all cases where a string is returned, ES:DI must point to
- a buffer supplied by the user, and the switch will copy the data to
- this buffer. The code does NOT return pointers to its own data.
-
-
- AH = 0 Get node/switch version number and description. On return
- AH='B',AL='P',BH='Q',BL=' '
- DH = major version number and DL = minor version number
-
-
- AH = 1 Set application mask to value in DL.
- Set application flags to value in CL.
- If top bit of CL is set, monitored frames will be available.
- Use function 11 to receive them.
-
- AH = 2 Send frame in ES:SI (length CX)
-
-
- AH = 3 Receive frame into buffer at ES:DI, length of frame returned
- in CX. BX returns the number of outstanding frames still to
- be received (ie. after this one) or zero if no more frames
- (ie. this is last one).
- Note that CX is NOT an input param - the supplied buffer
- must be big enough to receive a full AX.25 frame, including
- up to 8 digi callsigns. 340 should be enough.
-
-
- AH = 4 Get stream status. Returns:
-
- CX = 0 if stream disconnected or CX = 1 if stream connected
- DX = 0 if no change of state, or DX = 1 if
- the connected/disconnected state has changed.
-
- AH = 5 ACK stream status change. Must be called to allow another
- status change to be reported.
-
-
- AH = 6 Session control.
-
- CX = 0 Connect to Node. Session uses BBS callsign if bottom
- bit of DL=1, otherwise uses Node Call .
-
- CX = 1 Connect to Node. Session uses BBS Call if APPLMASK=1,
- otherwise Node Call.
-
- CX = 2 Disconnect
- CX = 3 Return user to node
-
-
- AH = 7 Get buffer counts for stream. Returns:
-
- BX = number of frames queued for receive
- CX = number of un-acked frames to be sent
- DX = number of buffers left in node
-
-
- AH = 8 Port control/information. Called with a stream number
- in AL returns:
-
- ES:DI = CALLSIGN (10 bytes space padded)
-
- The following are now supported (4.05 onwards)
-
- AL = Radio port on which channel is connected (if level 2)
- AH = Session Type (If Connected). Session type bits are:
-
- L2LINK EQU 1
- SESSION EQU 10B
- UPLINK EQU 100B
- DOWNLINK EQU 1000B
- BPQHOST EQU 100000B
-
- BX = L2 paclen for the session
- CX = Maxframe. Taken from PORT maxframe if L2 session,
- Switch maxframe if L4.
- DX = L4 window size (if L4 circuit, or zero)
-
-
- AH = 10 RAW (KISS) transmit frame. Data pointed to by ES:SI, of
- length CX, is transmitted as a HDLC frame on the radio
- port (not stream) in AL.
-
-
- AH = 11 Get Trace (RAW Data) Frame into ES:DI, Length to CX. Data
- is as received off air (ie with calls in AX.25 format, etc)
- See note on CX under function 3.
-
- The returned buffer includes a 5 byte header:
-
- Bytes 0-1 - Internal control info (ignore)
- Byte 2 - Port number. Top bit set if transmitted frame.
- Bytes 3-4 - Frame length (including this header)
-
-
- AH = 12 Update Switch Info. This will be used for a number of
- operations. At the moment the only ones implemented are to
- update the Beacon Text field, and initiate a NODES broadcast.
-
- DX = Function Number.
-
- DX = 1 Update Beacon Text.
-
- ES:SI Data to send in Beacons
- CX Length of Data
-
- DX = 2 Initiate NODES broadcast
-
- AH = 13 Allocate/deallocate stream
-
- If AL=0, return first free stream in AL. If AL=255 on
- return, there are no free streams
-
- If AL>0, CL=1, Allocate stream. If aleady allocated,
- return CX nonzero, else allocate, and return CX=0
-
- If AL>0, CL=2, Release stream
-
- Note that for compatiblity with old software, certain other
- functions also set the allocated bit (Functions 1,2,6). So
- an application has a reasonable chance of getting an unused
- stream, even if some applications dont use the allocate function.
-
-
- AH = 15 Get time marker in AX. Value is number of timer interrupts
- since switch was loaded, modulo 65536. Timer interrupts
- normally occur at approx 18.2 per second.
-
-
-
-
- PACLEN.
-
- Frames are transmitted as received from the application, so the application
- is responsible for the transmitted PACLEN. Function 8 will return the
- recommended value for the current session. I think the value is always OK,
- but I suggest you treat a value of zero as 'undefined', and use your own
- default. The value may change during a session, if for instance, you connect
- to the switch, and then out on a port with a different PACLEN. Also at
- some time in the future I hope to adjust PACLEN to suit conditions on the
- channel. So I recommend that the value is re-read from time to time during
- a session.
-
-
-
- The following sample of code shows how to find the Interrupt Number to use
- to call the switch, and check that the switch is loaded.
-
-
- NOTBPQERROR DB 'Switch not found$'
- VERSERROR DB 'Version not compatible with Node Software$'
-
- BADCONFIGMSG DB 'Configuration file read error',0DH,0AH,'$'
- CONFIGFILENAME DB 'BPQCFG.BIN',0
- NOCONFIGMSG DB 'Configuration file BPQCFG.BIN not found',0DH,0AH,'$'
- ;
- ; BPQCFG FIRST 128 BYTES
- ;
- CONFIGTABLE LABEL BYTE
- ;
- ; CONFIGURATION DATA STRUCTURE
- ;
- ; DEFINES LAYOUT OF CONFIG RECORD PRODUCED BY CONFIGURATION PROG
- ;
- ; LAYOUT MUST MATCH THAT IN CONFIG.C SOURCE
- ;
- C_NODECALL DB 10 DUP (0) ; OFFSET = 0
- C_NODEALIAS DB 10 DUP (0) ; OFFSET = 10
- C_BBSCALL DB 10 DUP (0) ; OFFSET = 20
- C_BBSALIAS DB 10 DUP (0) ; OFFSET = 30
- ;
- C_OBSINIT DW 0 ; OFFSET = 40
- C_OBSMIN DW 0 ; OFFSET = 42
- C_NODESINTERVAL DW 0 ; OFFSET = 44
- C_L3TIMETOLIVE DW 0 ; OFFSET = 46
- C_L4RETRIES DW 0 ; OFFSET = 48
- C_L4TIMEOUT DW 0 ; OFFSET = 50
- C_BUFFERS DW 0 ; OFFSET = 52
- C_PACLEN DW 0 ; OFFSET = 54
- C_TRANSDELAY DW 0 ; OFFSET = 56
- C_T3 DW 0 ; OFFSET = 58
- DW 0 ; OFFSET = 60
- DW 0 ; OFFSET = 62
- C_IDLETIME DW 0 ; OFFSET = 64
- C_EMSFLAG DB 0 ; OFFSET = 66
- DB 0
- C_BBS DB 0 ; OFFSET = 68
- C_NODE DB 0 ; OFFSET = 69
- C_HOSTINTERRUPT DB 0 ; OFFSET = 70
- C_DESQVIEW DB 0 ; OFFSET = 71
- C_MAXLINKS DW 0 ; OFFSET = 72
- C_MAXDESTS DW 0
- C_MAXNEIGHBOURS DW 0
- C_MAXCIRCUITS DW 0 ; 78
-
- C_TNCPORTLISTO DB 16 DUP (0) ; OFFSET = 80
-
- C_IDINTERVAL DW 0 ; 96
- C_XXXXXXXX DW 0 ; 98 ; SPARE (WAS DIGIFLAG)
- C_MINQUAL DW 0 ; 100
- C_HIDENODES DB 0 ; 102
- C_L4DELAY DW 0 ; 103
- C_L4WINDOW DW 0 ; 105
- C_BTINTERVAL DW 0 ; 106
- X_UNPROTO DB 9 DUP (0) ; 108 ; NOW SPARE
- C_BBSQUAL DW 0 ; 117
- DB (CONFIGTABLE+128-$) DUP (0)
-
-
-
- CONFIGHANDLE DW 0
-
- NODE:
- INT 7FH
- RET
-
-
- INIT:
- ;
- ; GET NODE INTERRUPT NUMBER FROM CONFIG FILE
- ;
- MOV DX,OFFSET CONFIGFILENAME
- MOV AH,3DH
- MOV AL,0 ; READ ONLY
- INT 21H ; OPEN IT
-
- JC NOCONFIGFILE
-
- MOV CONFIGHANDLE,AX
-
- MOV BX,AX
- MOV DX,OFFSET CONFIGTABLE
- MOV CX,128
- MOV AH,3FH
-
- INT 21H ; READ
- CMP AX,CX
- JNE SHORTCONFIG
-
- JMP SHORT PROCESSCONFIG
-
- NOCONFIGFILE:
-
- MOV DX,OFFSET NOCONFIGMSG
- JMP SHORT CONFIGERR
-
- SHORTCONFIG:
-
- MOV DX,OFFSET BADCONFIGMSG
-
- CONFIGERR:
-
- MOV AH,9
- INT 21H
-
- MOV AX,4C01H
- INT 21H ; EXIT
-
- PROCESSCONFIG:
-
- MOV BX,CONFIGHANDLE
- MOV AH,3EH
- INT 21H ; CLOSE IT
-
- MOV AL,C_HOSTINTERRUPT ; INTERRUPT
- MOV BYTE PTR NODE+1,AL ; PATCH NODE CALL INSTRUCTION
- ;
- ; GET NODE VERSION
- ;
- PUSH DS
- MOV AH,0
- ADD AX,AX ; VECTORS ARE 4 BYTES LONG
- ADD AX,AX
- MOV SI,AX
-
- XOR AX,AX
- MOV DS,AX
- ;
- ; DS:SI POINTS OUR VECTOR
- ;
- ; FIRST SEE IF VECTOR POINTS TO CODE - CALLING AN UNINITIALISED
- ; INTERRUPT WILL CRASH THE SYSTEM
- ;
- CMP WORD PTR DS:2[SI],0 ; INTERRUPT ROUTINE SEGMENT ADDRT
-
- POP DS
-
- JNE SWITCHOK ; ROUTINE PRESENT
-
- NOSWITCH:
-
- MOV DX,OFFSET NOTBPQERROR
-
- MOV AH,9
- INT 21H
-
- JMP SHORT EXIT
-
- SWITCHOK:
-
- MOV AH,0
- CALL NODE ; SET INSTALLED FLAGS AND VERSION
-
- CMP AX,'PB' ; AX,BX SHOULD BE 'BPQ '
- JNE NOSWITCH
-
- CMP BX,' Q'
- JNE NOSWITCH
-
- CMP DH,MAJORVERSION
- JNE BADVERSION
-
- CMP DL,MINORVERSION
- JE VERSIONOK
-
-
- BADVERSION:
-
- POP DS
-
- MOV DX,OFFSET VERSERROR
- MOV AH,9
- INT 21H
-
- EXIT:
- MOV AX,4C00H
- INT 21H
-
- VERSIONOK:
-
- POP DS
- ;
- ..........
-
-
-
- The release disk also contains a demonstration terminal program, TERM4,
- written by G8IMB (in PASCAL) to demonstate the use of the new interface from
- a high level language. Note, however, that it was written for version 4.02,
- and therefore only works with the Host Mode interrupt configured at 7Fh
-
-
-
- John Wiseman, G8BPQ @ GB7BAD
- 20/12/91
- Revised 5/9/92 and 26/3/94
-